# 项目名称
TARGET := keydebounce

# 编译器和工具链
CC := arm-linux-gnueabihf-gcc
LD := arm-linux-gnueabihf-ld
OBJCOPY := arm-linux-gnueabihf-objcopy
OBJDUMP := arm-linux-gnueabihf-objdump
RM := rm -rf

# 目录定义
BUILD_DIR := Build
OBJ_DIR := Object
SRC_DIR := Project
DRIVER_DIR := StdPeriph_Driver/Source
INCLUDE_DIRS := -I IMX6ULL -I StdPeriph_Driver/Include

# 链接脚本和启动文件
LINKER_SCRIPT := $(SRC_DIR)/linker.lds
STARTUP_FILE := $(SRC_DIR)/startup.s

# 源文件和目标文件
C_SOURCES := $(wildcard $(SRC_DIR)/*.c $(DRIVER_DIR)/*.c)
ASM_SOURCES := $(STARTUP_FILE)
C_OBJECTS := $(patsubst %.c, $(OBJ_DIR)/%.o, $(notdir $(C_SOURCES)))
ASM_OBJECTS := $(patsubst %.s, $(OBJ_DIR)/%.o, $(notdir $(ASM_SOURCES)))
OBJECTS := $(C_OBJECTS) $(ASM_OBJECTS)

# 编译选项
CFLAGS := -g -O0 -std=c99 -mcpu=cortex-a7 -marm $(INCLUDE_DIRS) -c
LDFLAGS := -T$(LINKER_SCRIPT) -nostdlib

# 目标文件
ELF_FILE := $(BUILD_DIR)/$(TARGET).elf
BIN_FILE := $(BUILD_DIR)/$(TARGET).bin
HEX_FILE := $(BUILD_DIR)/$(TARGET).hex
DIS_FILE := $(BUILD_DIR)/$(TARGET).dis

# 清理时需要保留的文件
KEEP_FILES := $(BUILD_DIR)/imxdownload

# 默认目标
all: $(BUILD_DIR) $(OBJ_DIR) $(BIN_FILE) $(HEX_FILE) $(DIS_FILE)

# 创建目录
$(BUILD_DIR) $(OBJ_DIR):
	mkdir -p $@

# 编译C源文件
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
	$(CC) $(CFLAGS) $< -o $@

$(OBJ_DIR)/%.o: $(DRIVER_DIR)/%.c | $(OBJ_DIR)
	$(CC) $(CFLAGS) $< -o $@

# 编译汇编源文件
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.s | $(OBJ_DIR)
	$(CC) $(CFLAGS) $< -o $@

# 链接生成ELF文件
$(ELF_FILE): $(OBJECTS) | $(BUILD_DIR)
	$(LD) $(LDFLAGS) $(OBJECTS) -o $@

# 生成二进制文件
$(BIN_FILE): $(ELF_FILE)
	$(OBJCOPY) -O binary $< $@

# 生成十六进制文件
$(HEX_FILE): $(ELF_FILE)
	$(OBJCOPY) -O ihex $< $@

# 生成反汇编文件
$(DIS_FILE): $(ELF_FILE)
	$(OBJDUMP) -D $< > $@

# 依赖项
.PHONY: clean download

# 清理 - 只删除Object目录，Build目录下保留imxdownload，其余全部删除
clean:
	$(RM) $(OBJ_DIR)
	find $(BUILD_DIR) -type f ! -name 'imxdownload' -delete
	$(RM) load.imx
# 烧录（使用imxdownload工具）
download: $(BIN_FILE)
	$(BUILD_DIR)/imxdownload $(BIN_FILE) /dev/sdb  # 注意:请替换为实际的SD卡设备